package com.taiyi.sqltoy.starter.autoconfigure;

import com.taiyi.sqltoy.starter.context.UserContext;
import com.taiyi.sqltoy.starter.context.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

/**
 * 用户上下文助手类
 * 提供便捷的用户上下文操作方法
 * 
 * @author taiyi
 * @since 1.0.0
 */
@Slf4j
public class TaiyiUserContextHelper {

    private final UserContext userContext;

    public TaiyiUserContextHelper(UserContext userContext) {
        this.userContext = userContext;
    }

    /**
     * 设置当前用户上下文
     * 
     * @param userId 用户ID
     * @param username 用户名
     * @param tenantId 租户ID
     */
    public void setCurrentUser(String userId, String username, String tenantId) {
        if (StringUtils.hasText(userId)) {
            userContext.setCurrentUser(userId, username, tenantId);
            if (log.isDebugEnabled()) {
                log.debug("设置用户上下文: userId={}, username={}, tenantId={}", userId, username, tenantId);
            }
        } else {
            log.warn("用户ID为空，无法设置用户上下文");
        }
    }

    /**
     * 设置当前用户上下文
     * 
     * @param userInfo 用户信息
     */
    public void setCurrentUser(UserInfo userInfo) {
        if (userInfo != null && StringUtils.hasText(userInfo.getUserId())) {
            setCurrentUser(userInfo.getUserId(), userInfo.getUsername(), userInfo.getTenantId());
        } else {
            log.warn("用户信息无效，无法设置用户上下文");
        }
    }

    /**
     * 清除当前用户上下文
     */
    public void clearCurrentUser() {
        userContext.clearCurrentUser();
        if (log.isDebugEnabled()) {
            log.debug("已清除用户上下文");
        }
    }

    /**
     * 获取当前用户ID
     * 
     * @return 用户ID
     */
    public String getCurrentUserId() {
        return userContext.getCurrentUserId();
    }

    /**
     * 获取当前用户名
     * 
     * @return 用户名
     */
    public String getCurrentUsername() {
        return userContext.getCurrentUsername();
    }

    /**
     * 获取当前租户ID
     * 
     * @return 租户ID
     */
    public String getCurrentTenantId() {
        return userContext.getCurrentTenantId();
    }

    /**
     * 判断是否有当前用户
     * 
     * @return true表示有当前用户，false表示没有
     */
    public boolean hasCurrentUser() {
        return userContext.hasCurrentUser();
    }

    /**
     * 执行带用户上下文的操作
     * 
     * @param userId 用户ID
     * @param username 用户名
     * @param tenantId 租户ID
     * @param runnable 要执行的操作
     */
    public void runWithUser(String userId, String username, String tenantId, Runnable runnable) {
        String originalUserId = getCurrentUserId();
        String originalUsername = getCurrentUsername();
        String originalTenantId = getCurrentTenantId();
        
        try {
            setCurrentUser(userId, username, tenantId);
            runnable.run();
        } finally {
            if (StringUtils.hasText(originalUserId)) {
                setCurrentUser(originalUserId, originalUsername, originalTenantId);
            } else {
                clearCurrentUser();
            }
        }
    }

    /**
     * 执行带用户上下文的操作，并返回结果
     * 
     * @param userId 用户ID
     * @param username 用户名
     * @param tenantId 租户ID
     * @param supplier 要执行的操作
     * @param <T> 返回类型
     * @return 操作结果
     */
    public <T> T callWithUser(String userId, String username, String tenantId, java.util.function.Supplier<T> supplier) {
        String originalUserId = getCurrentUserId();
        String originalUsername = getCurrentUsername();
        String originalTenantId = getCurrentTenantId();
        
        try {
            setCurrentUser(userId, username, tenantId);
            return supplier.get();
        } finally {
            if (StringUtils.hasText(originalUserId)) {
                setCurrentUser(originalUserId, originalUsername, originalTenantId);
            } else {
                clearCurrentUser();
            }
        }
    }
}